From 46a8326d79af856451979c0c094d64531cac48d3 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Tue, 8 Feb 2005 15:42:26 +0000 Subject: [PATCH] bitkeeper revision 1.1159.251.1 (4208dde2yO5a2hmuPJlwJg0U4vM8yA) Use p_paddr when loading Elf program segments; not p_vaddr. Signed-off-by: keir.fraser@cl.cam.ac.uk --- tools/libxc/xc_linux_build.c | 12 ++++++------ tools/libxc/xc_vmx_build.c | 12 ++++++------ xen/common/elf.c | 14 ++++++-------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index dd903751a9..c75a0837b7 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -558,10 +558,10 @@ static int parseelfimage(char *elfbase, phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize)); if ( !is_loadable_phdr(phdr) ) continue; - if ( phdr->p_vaddr < kernstart ) - kernstart = phdr->p_vaddr; - if ( (phdr->p_vaddr + phdr->p_memsz) > kernend ) - kernend = phdr->p_vaddr + phdr->p_memsz; + if ( phdr->p_paddr < kernstart ) + kernstart = phdr->p_paddr; + if ( (phdr->p_paddr + phdr->p_memsz) > kernend ) + kernend = phdr->p_paddr + phdr->p_memsz; } if ( (kernstart > kernend) || @@ -611,7 +611,7 @@ loadelfimage( for ( done = 0; done < phdr->p_filesz; done += chunksz ) { - pa = (phdr->p_vaddr + done) - vstart; + pa = (phdr->p_paddr + done) - vstart; va = xc_map_foreign_range( xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); chunksz = phdr->p_filesz - done; @@ -624,7 +624,7 @@ loadelfimage( for ( ; done < phdr->p_memsz; done += chunksz ) { - pa = (phdr->p_vaddr + done) - vstart; + pa = (phdr->p_paddr + done) - vstart; va = xc_map_foreign_range( xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); chunksz = phdr->p_memsz - done; diff --git a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c index aaae52f0c5..4ccc274c68 100644 --- a/tools/libxc/xc_vmx_build.c +++ b/tools/libxc/xc_vmx_build.c @@ -629,10 +629,10 @@ static int parseelfimage(char *elfbase, phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize)); if ( !is_loadable_phdr(phdr) ) continue; - if ( phdr->p_vaddr < kernstart ) - kernstart = phdr->p_vaddr; - if ( (phdr->p_vaddr + phdr->p_memsz) > kernend ) - kernend = phdr->p_vaddr + phdr->p_memsz; + if ( phdr->p_paddr < kernstart ) + kernstart = phdr->p_paddr; + if ( (phdr->p_paddr + phdr->p_memsz) > kernend ) + kernend = phdr->p_paddr + phdr->p_memsz; } if ( (kernstart > kernend) || @@ -676,7 +676,7 @@ loadelfimage( for ( done = 0; done < phdr->p_filesz; done += chunksz ) { - pa = (phdr->p_vaddr + done) - vstart - LINUX_PAGE_OFFSET; + pa = (phdr->p_paddr + done) - vstart - LINUX_PAGE_OFFSET; va = xc_map_foreign_range( xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); chunksz = phdr->p_filesz - done; @@ -689,7 +689,7 @@ loadelfimage( for ( ; done < phdr->p_memsz; done += chunksz ) { - pa = (phdr->p_vaddr + done) - vstart - LINUX_PAGE_OFFSET; + pa = (phdr->p_paddr + done) - vstart - LINUX_PAGE_OFFSET; va = xc_map_foreign_range( xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]); chunksz = phdr->p_memsz - done; diff --git a/xen/common/elf.c b/xen/common/elf.c index 7c94dab5e2..685d733e56 100644 --- a/xen/common/elf.c +++ b/xen/common/elf.c @@ -13,10 +13,8 @@ #ifdef CONFIG_X86 #define FORCE_XENELF_IMAGE 1 -#define ELF_ADDR p_vaddr #elif defined(__ia64__) #define FORCE_XENELF_IMAGE 0 -#define ELF_ADDR p_paddr #endif static inline int is_loadable_phdr(Elf_Phdr *phdr) @@ -100,10 +98,10 @@ int parseelfimage(char *elfbase, phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize)); if ( !is_loadable_phdr(phdr) ) continue; - if ( phdr->ELF_ADDR < kernstart ) - kernstart = phdr->ELF_ADDR; - if ( (phdr->ELF_ADDR + phdr->p_memsz) > kernend ) - kernend = phdr->ELF_ADDR + phdr->p_memsz; + if ( phdr->p_paddr < kernstart ) + kernstart = phdr->p_paddr; + if ( (phdr->p_paddr + phdr->p_memsz) > kernend ) + kernend = phdr->p_paddr + phdr->p_memsz; } if ( (kernstart > kernend) || @@ -144,10 +142,10 @@ int loadelfimage(char *elfbase) if ( !is_loadable_phdr(phdr) ) continue; if ( phdr->p_filesz != 0 ) - memcpy((char *)phdr->ELF_ADDR, elfbase + phdr->p_offset, + memcpy((char *)phdr->p_paddr, elfbase + phdr->p_offset, phdr->p_filesz); if ( phdr->p_memsz > phdr->p_filesz ) - memset((char *)phdr->ELF_ADDR + phdr->p_filesz, 0, + memset((char *)phdr->p_paddr + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz); } -- 2.30.2